ゲノムブラウザ JBrowse2 をグローバル IP 制限付きで簡単に Web 公開してみた
ゲノムブラウザの JBrose2(静的サイト)を S3 を使って簡単に Web 公開してみましょう。Web サーバーを用意しなくてよいので維持費も運用管理も削減できるのでオススメです。
以前、CloudFront(CDN サービス) + S3 でリッチなゲノムブラウザ公開環境を作成しました。AWS に多少明るくないと難しいかもしれませんので、もっと手軽に公開できる環境として今回は S3 単体だけでやってみます。
パブリックに公開できないデータや、仲間内でちょっと利用したいとき用にグローバル IP でのアクセス制限の設定例も紹介します
S3 とは
Web 公開用の S3 バケットを作成
マネージメントコンソールからサクッと作ってみましょう。15分もあれば環境構築できます。
S3 バケット名は全世界でユニークな名前である必要があります。また独自ドメインで配信したい場合は、予定しているドメイン名を含めたバケット名を作成する必要があります。ご注意ください。
Amazon S3 の「バケット名が既に存在します」エラーを解決する
このバケット名ですと独自ドメインが使えないです。
パブリックアクセス可能な設定にします。
最低限なところでバージョニングと暗号化を有効化にしました。
いったん S3 バケットを作成し、あとで細かい設定をいれていきます。
静的サイトを有効化
プロパティタブから末尾にある静的ウェブサイトホスティングを編集します。
インデックスドキュメントはアップロードするファイル名に応じて変更してください。
変更の保存をクリックすると、Web 公開用の URL が表示されます。ですが、次のバケットポリシーを設定しないとまだアクセスできません。
S3 バケットポリシー
アクセス許可タブからバケットポリシーの編集をクリックします。
JSON形式でアクセス許可・拒否ルールを書くのですが難所です。よく利用するパターンを書きましたのでコピペしてお使いください。ただし、Resource
で指定する S3 バケット名(easy-share-jbrowse
)はご自身で作成したバケット名に変更して利用してください。
ここからコピペするとインデントが崩れバケットポリシー設定時にフォーマットエラーになるかもしれません。エラーがでた際は JSON整形ツールはなんでもよいので一度整形すると解消する可能性があります。
制限なしで公開
全世界に公開されます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGet", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::easy-share-jbrowse/*" } ] }
グローバルIP制限付き
特定のグローバル IP からは Web アクセス可能な設定です。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGet", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::easy-share-jbrowse/*" }, { "Sid": "RestrictIP", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::easy-share-jbrowse/*", "Condition": { "NotIpAddress": { "aws:SourceIp": "203.0.113.1/32" } } } ] }
グローバルIP制限複数パターン
大学や研究機関の場合はグローバル IP を多く保有しているかと思います。複数のグローバル IP を設定する場合は以下の様な書き方になります。また、共同研究などで共有したい相手いる場合は、先方のグローバル IP をご確認にして設定してください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGet", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::easy-share-jbrowse/*" }, { "Sid": "RestrictIP", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::easy-share-jbrowse/*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "203.0.113.1/32", "203.0.113.2/32", "198.51.100.0/24" ] } } } ] }
ファイルをアップロード
index.html
ファイルなど公開するファイルをアップロードします。マネージメントコンソールからもアップロードできます。アクセス制限する場合は事前にテスト用のindex.html
をアップロードしてアクセステスト後、限定公開したいファイルをアップロードしてください。
Jbrowse のファイルが多かったので AWS CLI コマンドでアップロードしました。
$ aws s3 sync ~/work/jbrowse/vol/jbrowse2/ s3://easy-share-jbrowse
ファイルは以前作成したものを流用しています。詳細は以下のリンクをご参照ください。
アクセステスト
バケットポリシー設定まではアクセスできなかった URL がやっと使えるようになりました。今回はグローバルIP制限付きのパターンでバケットポリシーを設定しました。
許可対象のグローバル IP からアクセスすると画面を表示できました。また https(TLS暗号化)でアクセスできます。
許可対象外のグローバル IP からアクセスすると以下の様にAccess Denied
と表示されます。同じネットワークに接続されていないスマートフォンでチェックすると簡単かもしれません。
以上でグローバル IP 制限付きの公開設定は完了です。肝はバケットポリシーです。
補足
独自ドメインで配信したい(Route 53 利用時)
独自ドメインで配信したい場合は、予定しているドメイン名を含めたバケット名を作成する必要がありました。そのため、ドメイン名を含め忘れると Route 53 のエイリアス登録時に S3 エンドポイントを選択できない状態になります。
ドメイン名を含めたバケット名を作成し、S3 バケット名と同じエイリアスを登録するときは S3 エンドポイントを選択できます。
独自ドメインでアクセス可能になります。https ではアクセスできないのが難点です。
独自ドメイン + https アクセスを実現するには CloudFront の利用をご検討ください。
その他
セキュリティ周りが気になる方は以下のリンクをご確認ください。
今回バージョニングの設定を有効化した S3 バケットを作成しています。試行錯誤しているうちに意図しないファイルの更新が発生し、ムダにファイルを保持する可能性があります。ライフサイクルルールと言う便利な機能がありますので合わせてご確認ください。
おわりに
バイオインフォマティシャンの方も静的サイトを公開することがあれば AWS(CloudFront + S3)の利用はいかがでしょうか。Web サーバーのお守りは本質的ではないので静的サイトなら S3 の利用で楽できると思います。
ちなみに私は S3 バケットに直接独自ドメインをつけようと思ったことがなかったので S3 バケットにドメイン名も入れないといけないことをはじめて知りました。